package service

import (
	"sync"
)

type UserStore interface {
	Save(user *User) error
	Find(username string) (*User, error)
}

type InMemoryUserStore struct {
	mutex   sync.RWMutex
	userMap map[string]*User
}

func NewInMemoryUserStore() *InMemoryUserStore {
	return &InMemoryUserStore{
		userMap: make(map[string]*User),
	}
}

func (store *InMemoryUserStore) Save(user *User) error {
	store.mutex.Lock()
	defer store.mutex.Unlock()

	if store.userMap[user.UserName] != nil {
		return ErrAlreadyExists
	}
	store.userMap[user.UserName] = user.Clone() //由于是保存在内存中，需要考虑安全问题
	return nil
}
func (store *InMemoryUserStore) Find(username string) (*User, error) {
	store.mutex.RLock()
	defer store.mutex.RUnlock()
	user := store.userMap[username]
	if user == nil {
		return nil, nil
	}
	return user.Clone(), nil
}
